package com.tools.genxsd.entity;

import com.tools.genxsd.entity.type.XsdAttributeType;
import com.tools.genxsd.entity.type.XsdComplexType;
import com.tools.genxsd.util.SeqUtil;
import lombok.Getter;
import lombok.Setter;

import java.util.List;
import java.util.Objects;

import static com.tools.genxsd.enums.OrderEnum.ORDER_CHOICE;
import static com.tools.genxsd.enums.OrderEnum.ORDER_SEQUENCE;


/**
 * 自定义节点对象
 *
 * @author: zhoubin
 * @date: 2022/11/9
 */
@Getter
@Setter
public class XsdElement {

    /**
     * 节点名
     */
    private String name;

    /**
     * 描述，报文要素
     */
    private String mark;

    /**
     * 父节点
     */
    private XsdElement parent;

    /**
     * 节点类型
     */
    private XsdComplexType xsdType;

    /**
     * 数据类型
     */
    private String type;

    /**
     * 类型注释
     */
    private String typeDescribe;

    /**
     * 最大个数
     */
    private String maxOccurs;

    /**
     * 最小个数
     */
    private String minOccurs;

    /**
     * 属性列表
     */
    private List<XsdAttributeType> attrList;

    public XsdElement addElement(XElement xElement) {

        XsdElement element = new XsdElement();
        element.setName(xElement.getTag());
        element.setMark(xElement.getName());
        element.setParent(this);
        element.setMaxOccurs(xElement.getMaxOccurs());
        element.setMinOccurs(xElement.getMinOccurs());
        element.setType(xElement.getType());
        element.setTypeDescribe(xElement.getTypeDescribe());

        XsdBaseType complexType = getComplexType(xElement.isOr());
        complexType.setChild(element);
        return element;
    }

    private XsdBaseType getComplexType(boolean order) {

        if (Objects.isNull(this.xsdType)) {
            // 使用序号生成器生成唯一名
            this.xsdType = new XsdComplexType(SeqUtil.genAtoName(this.mark),
                    order ? ORDER_CHOICE.getMark() : ORDER_SEQUENCE.getMark());
        }

        return this.xsdType;
    }
}
